package cn.fang2chen.java.distributed.lock.framework;


import java.util.concurrent.TimeUnit;

/**
 * 远程锁同步器
 *
 * @author dcmini chen
 * @since 1.0.0
 */
public interface RemoteLockSynchronizer {

    /**
     * 获取锁
     * 阻塞式的
     *
     * @param remoteLockParam 远程锁的参数
     */
    default void acquire(RemoteLockParam remoteLockParam) {
        throw new UnsupportedOperationException();
    }

    /**
     * 可以被中止 获取远程锁
     *
     * @param remoteLockParam 远程锁的参数
     * @throws InterruptedException 当前线程中断
     */
    default void acquireInterruptibly( RemoteLockParam remoteLockParam) throws InterruptedException {
        throw new UnsupportedOperationException();
    }

    /**
     * 尝试获取锁
     *
     * @param remoteLockParam 远程锁的参数
     * @return {@code true} 获取到锁
     *         {@code false} 没有获取到锁
     */
    boolean tryAcquire( RemoteLockParam remoteLockParam);

    /**
     * 一定时间内尝试获取锁
     *
     * @param remoteLockParam 远程锁的参数
     * @param time 尝试的时长
     * @param unit 时间单位
     * @return {@code true} 获取到锁
     *         {@code false} 没有获取到锁
     * @throws InterruptedException 当前线程中断
     */
    default boolean tryAcquire( RemoteLockParam remoteLockParam, long time, TimeUnit unit) throws InterruptedException{
        throw new UnsupportedOperationException();
    }

    /**
     * 释放锁
     *
     * @param remoteLockParam 远程锁的参数
     * @return {@code true} 释放成功
     * {@code false} 释放失败
     */
    boolean release( RemoteLockParam remoteLockParam);

    /**
     * 是否处于锁定状态
     *
     * @param remoteLockParam 远程锁的参数
     * @return {@code true} 锁定
     * {@code false} 未锁定
     */
    default boolean isLocked( RemoteLockParam remoteLockParam) {
        throw new UnsupportedOperationException();
    }

    /**
     * 锁剩余的时长
     * {@code -1} 表示永远不会超时
     *
     * @param remoteLockParam 远程锁的参数
     * @return 剩余时长 单位 ms
     */
    default long remainingTime( RemoteLockParam remoteLockParam){
        throw new UnsupportedOperationException();
    }


    /**
     * 判断是否是远程锁的拥有者
     *
     * @param remoteLockParam 远程锁的参数
     * @return {@code true} 拥有锁
     *         {@code false} 未拥有锁
     */
    boolean isOwner( RemoteLockParam remoteLockParam);
}
